#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>


long long num = 0;
void Handler(int signo)
{
    // std::cout << "Get a signal,signal number is : " << signo << std::endl;
    std::cout << "Get a signal,signal number is : " << signo << ",num : " << num << std::endl;
}
void Usage(std::string arvg)
{
    std::cout << "Usage" << arvg << " signo  processid" << std::endl;
}
void PrintPending(const sigset_t &pending)
{
    std::cout << "curr pending list [" << getpid() << "]: " ;
    for(int signo = 31; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}
void non_handler(int signo)
{
    std::cout << "处理:" << signo << std::endl;
}


int main()
{
    signal(2,Handler);
    
    //signal(2,SIG_IGN);
    sigset_t block,oblock;
    // 初始化block位图，
    sigemptyset(&block);
    sigemptyset(&oblock);
    //我们并没有把2号屏蔽信号设置进内核，只是在用户栈创建了block位图结构;
    sigaddset(&block,2);
    
    //设置进程内核
    sigprocmask(SIG_SETMASK,&block,&oblock);
    //sigprocmask(SIG_BLOCK,&block,&oblock);

    int cnt = 0;
    while(true)
    {
        // 2. 如何获取pending表呢？
        sigset_t pending;
        sigpending(&pending);

        // 2.1 打印
        PrintPending(pending);

        sleep(1);

        cnt++;

        if(cnt == 10)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_UNBLOCK, &block, nullptr);
        }
    }
    

}

// int main()
// {
//     //signal(2,Handler);
//     signal(2,SIG_IGN);
//     sigset_t block,oblock;
//     // 初始化block位图，
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     //我们并没有把2号屏蔽信号设置进内核，只是在用户栈创建了block位图结构;
//     sigaddset(&block,2);
//     //设置进程内核
//     sigprocmask(SIG_SETMASK,&block,&oblock);

//     int cnt = 0;
//     while(true)
//     {
//         // 2. 如何获取pending表呢？
//         sigset_t pending;
//         sigpending(&pending);

//         // 2.1 打印
//         PrintPending(pending);

//         sleep(1);

//         cnt++;

//         if(cnt == 10)
//         {
//             std::cout << "解除对2号信号的屏蔽" << std::endl;
//             sigprocmask(SIG_SETMASK, &oblock, nullptr);
//         }
//     }
    

// }

// int main()
// {
//     if (fork() == 0)    
//     {
//         int *a = nullptr;
//         *a = 10;
//     }
//     int status;
//     waitpid(-1,&status,0);
//     std::cout << "exit signal: " << (status&0x7F) << " ,core dump : " << ((status >> 7) & 1) << std::endl;
//     return 0;
// }

// int main()
// {
//     // signal(11,Handler);
//     int* a =nullptr;
//     *a = 10;

//     //signal(8,Handler);
//     // int a = 10 / 0;//会不断循环执行Handler函数，因为当出现浮点数错误时候，其CPU的状态寄存器中的Eflag标记为会置为1，表示浮点数溢出，而进程切换
//     //或执行不会改变寄存器中的标记位，所以OS就会不断调度这个进程，检测到标志位为1，就会发送对应信号给进程

//     while(true);
//     return 0;
// }
// int main(int argc,char* argv[])
// {
//     alarm(5);
//     sleep(1);
//     int n = alarm(0);//取消闹钟
//     std::cout << n << std::endl;
//     // alarm(1);
//     // signal(SIGALRM,Handler);
//     //int num = 0;
//     while(true)
//     {
//         num++;
//         //printf("%d\n",num++);
//         //std::cout << num++ << std::endl;
//         // printf("%d\n",num);
//         // ++num;
//         //std::cout << num++ << std::endl;
//     }
//     // int cnt = 5;
//     // while(true)
//     // {
//     //     std::cout << "i am alive" << std::endl;
//     //     cnt--;
//     //     if(cnt <= 0)
//     //     abort();
//     //     sleep(1);
//     // }

//     // int cnt = 5;
//     // while(true)
//     // {
//     //     std::cout << "i am alive" << std::endl;
//     //     cnt--;
//     //     if(cnt <= 0)
//     //     raise(9);
//     //     sleep(1);
//     // }

//     // if(argc != 3)
//     // {
//     //     Usage(argv[0]);
//     //     exit(1);
//     // }
//     // int signo = std::stoi(argv[1]);
//     // int pid =  std::stoi(argv[2]);
//     // int n = kill(pid,signo);
//     // if(n < 0)
//     // {
//     //     perror("kill");
//     //     exit(1);
//     // }

//     // while (1)
//     // {
//     //     sleep(1);
//     //     std::cout << "hello world" << std::endl;
//     // }
//     // for(int signo = 1;signo < 32;signo++)
//     //     signal(signo,Handler);
//     // while(true)
//     // {
//     //     std::cout << "i am sleep" << std::endl;
//     //     sleep(1);
//     // }
//     return 0;
// }